package com.sakura.system.controller.yzccontroller;

//import com.rabbiter.cm.common.constant.MovieRankingList;
//import com.rabbiter.cm.common.response.ResponseResult;
//import com.rabbiter.cm.domain.SysMovie;
//import com.rabbiter.cm.domain.vo.SysMovieVo;
//import com.rabbiter.cm.service.impl.SysMovieServiceImpl;
//import com.rabbiter.cm.controller.BaseController;
import com.sakura.system.coommon.constant.MovieRankingList;
import com.sakura.system.coommon.response.ResponseResult;
import com.sakura.system.entity.xy.SysMovieVo;
import com.sakura.system.entity.yzc.SysMovie;
import com.sakura.system.service.impl.yzcimpl.SysMovieServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;


@RestController
@RequestMapping("${app.router.url}")
public class SysMovieController extends BaseController {

    @Autowired
    private SysMovieServiceImpl sysMovieService;

    /**
     * 查询所有电影信息
     *
     * @param sysMovieVo 电影查询条件封装对象
     * @return 返回电影信息列表的响应结果
     */
    @GetMapping("/sysMovie/find")
    public ResponseResult findAllMovies(SysMovieVo sysMovieVo) {
        // 初始化分页信息
        startPage();
        // 根据条件查询所有电影信息
        List<SysMovie> data = sysMovieService.findAllMovies(sysMovieVo);
        // 返回查询结果
        return getResult(data);
    }

    /**
     * 根据电影ID查询电影信息。
     *
     * @param id 电影的唯一标识符。
     * @return 返回一个包含电影信息的响应结果。
     */
    @GetMapping("/sysMovie/find/{id}")
    public ResponseResult findMovieById(@PathVariable Long id) {
        // 通过电影ID查询电影信息，并封装成响应结果返回
        return getResult(sysMovieService.findMovieById(id));
    }

    /**
     * 添加电影信息
     *
     * @param sysMovie 电影信息对象，通过RequestBody接收前端传来的JSON数据，必须是有效的SysMovie对象
     * @return 返回操作结果，包括成功与否、错误信息等
     */
    @PostMapping("/sysMovie")
    public ResponseResult addMovie(@Validated @RequestBody SysMovie sysMovie) {
        // 调用电影服务层的方法添加电影信息，并获取操作结果
        return getResult(sysMovieService.addMovie(sysMovie));
    }

    /**
     * 更新电影信息
     *
     * @param sysMovie 电影信息对象，通过RequestBody接收前端传来的JSON数据，必须是有效的SysMovie对象
     * @return 返回操作结果，包括成功与否、错误码和错误信息等
     */
    @PutMapping("/sysMovie")
    public ResponseResult updateMovie(@Validated @RequestBody SysMovie sysMovie) {
        // 调用电影服务层，更新电影信息，并封装操作结果返回
        return getResult(sysMovieService.updateMovie(sysMovie));
    }

    /**
     * 删除电影信息
     *
     * @param ids 通过路径变量传入的电影ID数组，用于指定要删除的电影
     * @return 返回操作结果，包括操作是否成功、错误信息等
     */
    @DeleteMapping("/sysMovie/{ids}")
    public ResponseResult deleteMovie(@PathVariable Long[] ids) {
        // 调用电影服务层，执行删除操作，并获取操作结果
        return getResult(sysMovieService.deleteMovie(ids));
    }

    /**
     * 根据榜单ID查询榜单信息。
     *
     * @param listId 榜单ID，用于指定要查询的榜单。有效值为1到4，代表不同的榜单。
     * @return 返回查询结果，如果榜单ID不在有效范围内，则返回错误信息。
     * @throws NoSuchMethodException 如果尝试调用不存在的方法时抛出此异常。
     * @throws InvocationTargetException 如果在尝试调用方法时发生异常，则抛出此异常。
     * @throws IllegalAccessException 如果尝试访问的方法是不可访问的，则抛出此异常。
     */
    @GetMapping("/sysMovie/find/rankingList/{listId}")
    public ResponseResult findRankingList(@PathVariable Integer listId) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 检查榜单ID是否在支持的范围内
        if (listId <= 0 || listId > 4) {
            // 暂时只支持4种榜单
            return ResponseResult.error("抱歉，暂时只支持3种榜单，id为[1,3]");
        }
        // 通过反射获取指定榜单方法并调用
        Method getList = sysMovieService.getClass().getMethod(MovieRankingList.listNames[listId - 1]);
        startPage();
        List<SysMovie> data = (List<SysMovie>) getList.invoke(sysMovieService);
        return getResult(data);
    }

}
